OCR 技术详解
光学字符识别(Optical Character Recognition,OCR)是将图片中的文字转换为可编辑、可搜索的计算机文本的技术。本文从系统架构视角,梳理 OCR 技术的行为模型与结构模型,涵盖传统方法和深度学习方法的完整管线。
1. Computer Vision 两条线
Computer Vision(计算机视觉)从图像的数据流向来看,天然分成两条线:
1.1 成像(Image Formation)— 物理世界 → 数字图像
关注"如何从现实世界获取高质量的图像数据",偏电子工程/光学/物理:
| 环节 | 核心技术 | 代表产品/标准 |
|---|---|---|
| 光学系统 | 镜头设计、光圈、焦距、景深 | Canon EF、Zeiss、Sony G Master |
| 图像传感器 | CMOS/CCD、像素尺寸、量子效率、动态范围 | Sony IMX、Samsung ISOCELL、OmniVision |
| ISP 流水线 | Bayer 去马赛克、白平衡、降噪、HDR 合成、色调映射 | Qualcomm Spectra、Apple ISP、海思麒麟 ISP |
| 计算摄影 | 多帧合成、夜间模式、人像虚化、超分辨率重建 | Apple Deep Fusion、Google HDR+、华为 XD Fusion |
| 编解码 | JPEG/HEIF/AVIF/RAW 压缩、色度子采样 | libjpeg、libheif、x265 |
| 3D 成像 | ToF、结构光、双目立体视觉、LiDAR | Apple LiDAR、Intel RealSense、Microsoft Kinect |
核心命题:如何忠实地捕捉和再现物理世界的光信号。评价指标是信噪比、动态范围、色彩准确度。
1.2 解像(Image Understanding)— 数字图像 → 语义信息
关注"从图像像素中提取有意义的结构化信息",偏算法/深度学习/认知:
| 任务 | 核心方法 | 代表模型/系统 |
|---|---|---|
| 图像分类 | CNN(ResNet/EfficientNet)、ViT | ImageNet 预训练模型 |
| 目标检测 | YOLO、Faster R-CNN、DETR、RT-DETR | YOLOv8/v11、DINOv2 |
| 语义分割 | FCN、U-Net、DeepLab、SAM | SAM 2、Mask2Former |
| 实例分割 | Mask R-CNN、YOLACT、SAM | SAM 2 |
| OCR(文字识别) | DB 检测 + CRNN/SVTR 识别;VLM 端到端 | PaddleOCR、Tesseract、TrOCR |
| 人脸识别 | FaceNet、ArcFace、InsightFace | ArcFace、DeepFace |
| 姿态估计 | OpenPose、HRNet、ViTPose | MediaPipe Pose |
| 图像生成 | GAN、VAE、Diffusion Model、DiT | Stable Diffusion、DALL-E、Flux |
| 多模态理解 | VLM(CLIP、LLaVA、GPT-4V) | GPT-4V、Qwen-VL、PaddleOCR-VL |
| 视频理解 | 3D CNN、Video Transformer、时序动作检测 | TimeSformer、VideoMAE |
核心命题:从像素中提取语义标签、空间位置、逻辑关系。评价指标是精度、召回率、mAP。
1.3 两条线的关系
图 1.3:成像线与解像线的关系
成像为解像提供输入;解像反过来驱动成像优化(如 ISP 中的 AI 降噪、人脸检测辅助自动对焦)。两者在手机上深度融合——同一块 SoC 上既有 ISP 又有 NPU,成像和解像协同工作。
OCR 属于解像线中的文字识别任务,是图像理解的经典应用。
2. OCR 技术概述
OCR 系统本质上是一个从图像到文本的转换管线。输入是一张包含文字的光栅图像(扫描件、照片、截图),输出是可被计算机处理的文本字符串及文字位置信息。
核心挑战:不同字体、字号、语言(含非拉丁字符如中文/阿拉伯文)、文字方向、弯曲/倾斜/遮挡、光照不均、复杂背景(自然场景)、表格/公式等结构化内容的识别。
2.1 传统 OCR vs 深度学习 OCR
| 维度 | 传统 OCR(Tesseract 3.x) | 深度学习 OCR(Tesseract 4+/PaddleOCR) |
|---|---|---|
| 文本检测 | 连通域分析、投影法 | CNN 目标检测(EAST/DB/CTPN) |
| 文本识别 | 字符切分 + 模板匹配 | CRNN+CTC / Transformer+Attention |
| 泛化能力 | 弱,需针对字体训练 | 强,端到端学习 |
| 多语言 | 每种语言独立训练数据 | 可多语言联合训练 |
| 手写体 | 基本不支持 | 有限支持 |
3. 发展历程
| 阶段 | 时间 | 代表技术 |
|---|---|---|
| 早期探索 | 1910s–1950s | 光电扫描设备,可识别简单字符 |
| 模板匹配时代 | 1960s–1980s | 字符规范化 + 模板匹配;邮政编码识别 |
| 特征工程时代 | 1990s–2000s | Tesseract(HP 1985→Google 2006);SVM/ANN 分类器 |
| 深度学习时代 | 2015–至今 | CRNN+CTC(2015);Tesseract 4 LSTM(2018);PaddleOCR/PP-OCR(2020-2026) |
| VLM 多模态时代 | 2024–至今 | PaddleOCR-VL、TrOCR、Donut——视觉-语言模型直接端到端解析文档为 Markdown/JSON |
4. 行为图(系统做什么)
4.1 用例图 — 系统功能全景
图 4.1:OCR 系统用例图
4.2 活动图 — OCR 识别管线(带泳道)
图 4.2:OCR 识别管线活动图(泳道:用户 → 应用 → OCR引擎 → 后处理)
4.3 状态机图 — 文档/图片处理状态
图 4.3:OCR 文档处理状态机图
4.4 序列图 — OCR 引擎内部交互
图 4.4:OCR 引擎一次识别请求的序列图
5. 结构图(系统由什么组成)
5.1 组件图 — 系统架构
图 5.1:OCR 系统组件架构图
5.2 类图 — 核心模块
图 5.2:OCR 引擎核心类图(抽象建模)
5.3 部署图 — 部署拓扑
图 5.3:OCR 系统多场景部署图
6. 主流 OCR 引擎对比
| 引擎 | 开源 | 语言 | 架构 | 特点 |
|---|---|---|---|---|
| Tesseract | Apache 2.0 | C++ (libtesseract) | 4.x: LSTM 行识别;5.x: 改进 LSTM | 100+ 语言,成熟稳定,命令行 + C/C++ API;无 GUI;不支持版面分析 |
| PaddleOCR | Apache 2.0 | Python | PP-OCRv6:DB 文本检测 + SVTR 文本识别;PaddleOCR-VL:VLM 端到端 | 100+ 语言,SOTA 精度;版面/表格/公式解析;轻量 VLM 支持 Markdown/JSON 输出 |
| EasyOCR | Apache 2.0 | Python | CRAFT 检测 + CRNN 识别 | 80+ 语言,即装即用,Torch 后端,API 简洁 |
| TrOCR | MIT | Python | Transformer Encoder-Decoder(ViT + RoBERTa) | 基于 HuggingFace,纯 Transformer 架构;仅文字识别(需配合检测器) |
| OCRmyPDF | MPL 2.0 | Python | 基于 Tesseract,叠加 PDF 文本层 | 对 PDF 友好,生成可搜索 PDF/A;不会丢失原始文件质量 |
7. 典型识别管线拆解
7.1 图像预处理
- 灰度化/二值化:Otsu、自适应阈值、Sauvola
- 去噪:中值滤波、高斯滤波、NLM
- 倾斜校正(Deskew):霍夫变换检测文本方向
- 透视校正:检测文档边界后做仿射/透视变换
- 超分辨率:低分辨率图片放大(ESRGAN 等)
7.2 文本检测
| 算法 | 年份 | 原理 | 适用 |
|---|---|---|---|
| CTPN | 2016 | VGG16 + 双向 LSTM 检测水平文本行 | 文档扫描件 |
| EAST | 2017 | FCN 直接预测文本区域和旋转角度 | 任意方向文本 |
| CRAFT | 2019 | 逐字符热力图 + 字符间关联 | 弯曲/不规则文本 |
| DB(Differentiable Binarization) | 2020 | 可微二值化,高效分割 | PaddleOCR PP-OCRv4/v5/v6 默认 |
7.3 文本识别
| 算法 | 年份 | 原理 |
|---|---|---|
| CRNN+CTC | 2015 | CNN 提取特征 → RNN 序列建模 → CTC 解码(无需字符分割) |
| ASTER | 2019 | STN 矫正 + Attention Seq2Seq |
| SVTR | 2022 | 单视觉 Transformer,直接图像到字符序列 |
| TrOCR | 2021 | ViT 编码器 + 文本 Transformer 解码器 |
| PaddleOCR-VL | 2025 | 0.9B VLM:NaViT 动态分辨率视觉编码器 + ERNIE 语言模型 |
7.4 后处理
- 拼写纠错:词典匹配、编辑距离、语言模型
- 版面恢复:阅读顺序排序(从上到下、从左到右;多栏处理)
- 格式输出:纯文本、hOCR、ALTO、PDF 文本层、Markdown、JSON
8. 用户使用手册
8.1 Tesseract
安装
# macOS brew install tesseract # Ubuntu/Debian sudo apt install tesseract-ocr tesseract-ocr-eng tesseract-ocr-chi-sim # 下载语言包到 tessdata 目录
命令行使用
# 基础识别(英语) tesseract image.png output -l eng # 中文识别 tesseract image.png output -l chi_sim # 指定 OCR 引擎模式 (LSTM) 和页面分割模式 tesseract image.png output -l eng --oem 1 --psm 3 # 输出为可搜索 PDF tesseract image.png output pdf # 常用参数 # --oem: 0=旧引擎, 1=LSTM, 2=旧+LSTM, 3=默认 # --psm: 0-13 页面分割模式(3=自动, 6=单文本块, 7=单行, 8=单词)
Python API
import pytesseract
from PIL import Image
text = pytesseract.image_to_string(Image.open('image.png'), lang='eng')
# 获取文字位置
data = pytesseract.image_to_data(Image.open('image.png'), lang='eng',
output_type=pytesseract.Output.DICT)
8.2 PaddleOCR
安装
pip install paddlepaddle # CPU 版 pip install paddlepaddle-gpu # GPU 版 pip install paddleocr
场景文字识别(PP-OCRv6)
from paddleocr import PaddleOCR
ocr = PaddleOCR(lang='ch') # 中文(含英文)
result = ocr.ocr('image.png')
for line in result[0]:
box = line[0] # [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]
text = line[1][0] # 识别文字
score = line[1][1] # 置信度
文档结构解析(PP-StructureV3)
from paddleocr import PPStructure
engine = PPStructure(lang='ch', use_gpu=True)
result = engine('document.pdf', return_ocr_result_in_table=True)
# 输出包含 Markdown 格式的版面、表格(含 HTML)、公式等
VLM 文档解析(PaddleOCR-VL)
from paddleocr import PaddleOCRVL
engine = PaddleOCRVL(use_gpu=True)
result = engine('document.pdf')
# 输出 Markdown/JSON 格式的结构化文档
8.3 OCRmyPDF
安装与使用
# 安装 pip install ocrmypdf # 给 PDF 添加 OCR 文本层 ocrmypdf input.pdf output.pdf # 指定语言、优化压缩 ocrmypdf -l chi_sim+eng --optimize 1 input.pdf output.pdf # 去斜、清洁扫描件 ocrmypdf --deskew --clean input.pdf output.pdf
8.4 EasyOCR
import easyocr
reader = easyocr.Reader(['ch_sim', 'en'])
result = reader.readtext('image.png')
# 返回 [(bbox, text, confidence), ...]